package com.boc.botv.model;
// Generated Jun 11, 2010 10:44:35 PM by Hibernate Tools 3.2.1.GA

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Représente une transaction entre le compte en banque d'un client et son compte virtuel présent sur le site.
 * @author Fabien Renaud
 */
@Entity
@Table(name = "BankTransaction", catalog = "botv")
public class BankTransaction implements java.io.Serializable {

  private Integer id;
  private PaymentMethod paymentMethod;
  private double debit;
  private double credit;
  private Date requestTime;
  private Date transactionTime;
  private boolean isApproved;

  /**
   * Crée une instance de transaction bancaire par défaut.
   */
  public BankTransaction() {
  }

  /**
   * Crée une instance de transaction bancaire.
   * @param paymentMethod La méthode de paiement
   * @param debit Montant du débit
   * @param credit Montant du crédit
   * @param requestTime Date à laquelle le client à créé la transaction
   * @param transactionTime Date effective de la transaction
   * @param isApproved Transaction approuvée ou non par un administrateur
   */
  public BankTransaction(PaymentMethod paymentMethod, double debit, double credit, Date requestTime, Date transactionTime, boolean isApproved) {
    this.paymentMethod = paymentMethod;
    this.debit = debit;
    this.credit = credit;
    this.requestTime = requestTime;
    this.transactionTime = transactionTime;
    this.isApproved = isApproved;
  }
  
  /**
   * Obtient l'id de la transaction
   * @return Id de la transaction
   */
  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  /**
   * Modifie l'id de la transaction
   * @param id Nouvel id de la transaction
   */
  public void setId(Integer id) {
    this.id = id;
  }

  /**
   * Obtient la méthode de paiement du client
   * @return La méthode de paiement du client
   */
  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "paymentMethod", nullable = false)
  public PaymentMethod getPaymentMethod() {
    return this.paymentMethod;
  }

  /**
   * Modifie la méthode de paiement du client
   * @param paymentMethod La nouvelle méthode de paiement du client
   */
  public void setPaymentMethod(PaymentMethod paymentMethod) {
    this.paymentMethod = paymentMethod;
  }

  /**
   * Obtient le montant du débit de la transaction
   * @return Montant du débit de la transaction
   */
  @Column(name = "debit", nullable = false, precision = 22, scale = 0)
  public double getDebit() {
    return this.debit;
  }

  /**
   * Modifie le montant du débit de la transaction
   * @param debit Nouveau montant du débit de la transaction
   */
  public void setDebit(double debit) {
    this.debit = debit;
  }

  /**
   * Obtient le montant du crédit de la transaction
   * @return Montant du crédit de la transaction
   */
  @Column(name = "credit", nullable = false, precision = 22, scale = 0)
  public double getCredit() {
    return this.credit;
  }

  /**
   * Modifie le montant du crédit de la transaction
   * @param credit Nouveau montant du crédit de la transaction
   */
  public void setCredit(double credit) {
    this.credit = credit;
  }

  /**
   * Obtient la date à laquelle le client à créé la transaction
   * @return Date à laquelle le client à créé la transaction
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "requestTime", nullable = false, length = 19)
  public Date getRequestTime() {
    return this.requestTime;
  }

  /**
   * Modifie la date à laquelle le client à créé la transaction
   * @param requestTime Nouvelle date de création pour cette transaction
   */
  public void setRequestTime(Date requestTime) {
    this.requestTime = requestTime;
  }

  /**
   * Obtient la date à laquelle la transaction a effectivement eu lieu
   * @return Date à laquelle la transaction a effectivement eu lieu
   */
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "transactionTime", nullable = false, length = 19)
  public Date getTransactionTime() {
    return this.transactionTime;
  }

  /**
   * Modifie la date à laquelle la transaction a effectivement eu lieu
   * @param transactionTime Date à laquelle la transaction a effectivement lieu
   */
  public void setTransactionTime(Date transactionTime) {
    this.transactionTime = transactionTime;
  }

  /**
   * Obtient si cette transaction a été approuvée par un administrateur ou non
   * @return true si approuvée, false sinon
   */
  @Column(name = "isApproved", nullable = false)
  public boolean isIsApproved() {
    return this.isApproved;
  }

  /**
   * Modifie l'état d'acceptation de cette transaction
   * @param isApproved État d'acceptation de cette transaction
   */
  public void setIsApproved(boolean isApproved) {
    this.isApproved = isApproved;
  }
}
